The term "architecture" is defined for the purposes of this document to mean the operating characteristics of a family of computer models. Examples of distinct architectures are: Macintosh computers, IBM PC compatible computers using the DOS or Windows operating systems, SUN Microsystems computers running the Solaris operating system, and computer systems using the Unix operating system.
The term "architecture neutral" is defined for the purposes of this document to refer to ability of certain programs, such as programs written in the Java (a trademark of Sun Microsystems, Inc.) language, to be executed on a variety of computer platforms using a number of different computer architectures.
The term "architecture specific" is defined for the purposes of this document to refer to requirement that certain programs to be executed only on computer platforms using a single computer architecture. For instance, object code programs written in the 80486 assembler language can only be executed on computers using the IBM PC compatible computer architecture (as well as in other computers that contains IBM PC compatible computer emulators).
Important features of architecture neutral programs (ANPrograms) include the architecture independence of programs written in the architecture neutral language (ANLanguage). For example, Java bytecode programs can be executed on any computer platform having a Java bytecode interpreter. An additional important feature of Java bytecode programs is that their integrity can be directly verified prior to execution by a Java bytecode verifier. A Java bytecode verifier determines whether the program conforms to predefined integrity criteria. Such criteria include operand stack and data type usage restrictions that ensure that Java bytecode programs cannot overflow or underflow the executing computer's operand stack and that all program instructions utilize only data of known data types. As a result, a Java bytecode program cannot create object pointers and generally cannot access system resources other than those which the user has explicitly granted it permission to use.
Unfortunately, distributing executable programs in an ANLanguage causes the ANProgram to run less efficiently than it would if it could take advantage of architecture specific features. For example, Java bytecode programs executed by a Java bytecode interpreter typically run 2.5 to 5 times as slow as the equivalent architecture specific programs (ASPrograms) compiled in corresponding architecture specific languages (ASLanguages). While a factor of five speed reduction is actually considered to be unusually good for an ANProgram executer (i.e., interpreter), it is a sufficient loss of efficiency that some users will require or insist upon the ability to use equivalent programs compiled in an ASLanguage.
Compilers that can compile an ANProgram into an equivalent ASProgram can be written. However, they may be prohibitively expensive for the end user. In addition, the integrity of the equivalent compiled ASProgram cannot be verified directly from the compiled ASProgram code by an ANProgram integrity verifier. Thus, in the case of Java bytecode programs, the use of ANPrograms compiled into equivalent ASPrograms potentially results in the loss of one of the most valuable features of an ANLanguage.
However, there are some legitimate (or legal) tasks that can be performed by integrity non-verifiable ASPrograms but which cannot be performed by integrity verifiable ANPrograms. These include tasks that would otherwise violate the operand stack and data type usage restrictions imposed on the integrity verifiable ANPrograms. In addition, such ASPrograms can be executed much faster than ANPrograms. As a result, there are number of reasons why it is desirable to have a computer system that is designed to primarily execute integrity verifiable ANPrograms but also has the capability of executing integrity non-verifiable ASPrograms.
Although compilation of ANPrograms by a third party is possible, such compilations require that the third party be authenticated. That is, it must be possible to verify from the information in the compiled ASProgram that it was compiled by a specific trusted third party. Even better, it should also be possible to authenticate that the compiled ASProgram was generated by a specific trusted compiler. And, since the integrity of the compiled ASProgram with respect to predefined integrity criteria cannot be directly verified, the compiled ASProgram should include information that in a verifiable manner identifies the corresponding ANProgram from which it was compiled and the ASLanguage in which it was compiled.
Thus, it is an object of the present invention to provide an ANProgram compiler and compilation method that enables the user of an ASProgram compiled from a corresponding ANProgram to authenticate the identify of who compiled the ANProgram, the identity of the corresponding ANProgram, and the ASLanguage in which the ASProgram was compiled.
It is another object of the present invention to provide an ANProgram executer and execution method that enables integrity verifiable ANPrograms being executed to call integrity non-verifiable ASPrograms that are trusted or that have verifiable sources and compilation information so that essentially all legitimate tasks can be performed, while preventing from being called ASPrograms whose sources, compilation information, and integrity cannot be verified.